package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.TipoOrgaoDAO;
import br.com.duosoftware.orcamento.daos.UnidadeGestoraDAO;
import br.com.duosoftware.orcamento.entidades.TipoOrgao;
import br.com.duosoftware.orcamento.entidades.UnidadeGestora;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 * 
 */
@ManagedBean
@ViewScoped
public class UnidadeGestoraBean implements Serializable {

    private UnidadeGestora unidadeGestora;
    private List<UnidadeGestora> unidadesGestoras;
    private UnidadeGestoraDAO unidadeGestoraDAO;
    //
    private List<SelectItem> tiposOrgao;
    
    public UnidadeGestoraBean() {
        unidadeGestoraDAO = new UnidadeGestoraDAO();
    }

    public UnidadeGestora getUnidadeGestora() {
        return unidadeGestora;
    }

    public void setUnidadeGestora(UnidadeGestora unidadeGestora) {
        this.unidadeGestora = unidadeGestora;
    }

    public List<UnidadeGestora> getUnidadesGestoras() {
        if(unidadesGestoras == null){
            unidadesGestoras = unidadeGestoraDAO.listarUnidadesGestoras();
        }
        return unidadesGestoras;
    }

    public void setUnidadesGestoras(List<UnidadeGestora> unidadesGestoras) {
        this.unidadesGestoras = unidadesGestoras;
    }
    
    /**
     * <b>Método que inicializa a unidadeGestora a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        unidadeGestora = new UnidadeGestora();
        
    }

    /**
     * <b>Método que adiciona ou edita uma UnidadeGestora</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     * 
     * @return void
     *
     */
    public void adicionarEditarFim() {

        unidadeGestoraDAO.salvarOuAtualizar(unidadeGestora);
        unidadeGestora = new UnidadeGestora();
        unidadesGestoras = null;
        
        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgUnidadeGestora.hide()");
        requestContext.update("formUnidadesGestoras:dtUnidadesGestoras");

    }

    /**
     * <b>Método para iniciar o processo de edição de um UnidadeGestora.</b> <p>
     *
     * Ele verifica se há um UnidadeGestora selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um UnidadeGestora selecionado o médoto abre o dialog para
     * edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (unidadeGestora == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        }else{
        
            RequestContext.getCurrentInstance().execute("dlgUnidadeGestora.show()");
            
        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um UnidadeGestora.</b> <p>
     *
     * Ele verifica se há uma UnidadeGestora selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um UnidadeGestora selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (unidadeGestora == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirUnidadeGestora.show()");
        }

    }

    /**
     * <b>Método para excluir um UnidadeGestora.</b> <p>
     *
     * Ele verifica se a UnidadeGestora selecionado para exclusão está sendo 
     * utilizado por alguma outra tabela do banco. Se estiver uma mensagem de 
     * aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            unidadeGestoraDAO.excluir(unidadeGestora);
            unidadeGestora = new UnidadeGestora();
            unidadesGestoras = null;
            
        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }
        
        RequestContext.getCurrentInstance()
                    .execute("dlgExcluirUnidadeGestora.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável UnidadeGestora para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        unidadeGestora = new UnidadeGestora();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgUnidadeGestora.hide()");
        requestContext.update("formUnidadeGestora:dtUnidadesGestoras");

    }
    
    //get de Select Items
    public List<SelectItem> getTiposOrgao() {
        
        if(tiposOrgao == null){
            
            tiposOrgao = new LinkedList<SelectItem>();
            
            for(TipoOrgao tipoOrgao : new TipoOrgaoDAO().listarTipoOrgao()){
            
                tiposOrgao.add(new SelectItem(tipoOrgao, tipoOrgao.toString()));
                
            }
             
        }
        
        return tiposOrgao;
    }
    
}
